const { Food } = require('../models');
const { Op } = require('sequelize');

const foodController = {
  // 获取食物列表
  async getFoods(req, res) {
    try {
      const { 
        page = 1, 
        pageSize = 10, 
        category = '', 
        keyword = '' 
      } = req.query;

      const where = {};
      
      // 按分类筛选
      if (category) {
        where.category = category;
      }

      // 按关键词搜索
      if (keyword) {
        where.name = {
          [Op.like]: `%${keyword}%`
        };
      }

      const offset = (page - 1) * pageSize;

      const { count, rows: foods } = await Food.findAndCountAll({
        where,
        order: [['name', 'ASC']],
        limit: parseInt(pageSize),
        offset: parseInt(offset)
      });

      res.json({
        foods,
        total: count,
        page: parseInt(page),
        pageSize: parseInt(pageSize),
        totalPages: Math.ceil(count / pageSize)
      });
    } catch (error) {
      console.error('获取食物列表失败:', error);
      res.status(500).json({ error: '获取食物列表失败' });
    }
  },

  // 获取食物详情
  async getFoodById(req, res) {
    try {
      const { id } = req.params;
      const food = await Food.findByPk(id);
      
      if (!food) {
        return res.status(404).json({ error: '食物不存在' });
      }

      res.json(food);
    } catch (error) {
      console.error('获取食物详情失败:', error);
      res.status(500).json({ error: '获取食物详情失败' });
    }
  },

  // 添加自定义食物
  async addFood(req, res) {
    try {
      const userId = req.user.id;
      const {
        name,
        category,
        unit,
        calories,
        protein,
        fat,
        carbs,
        fiber,
        sugar,
        sodium,
        image
      } = req.body;

      // 检查食物名称是否已存在
      const existingFood = await Food.findOne({ where: { name } });
      if (existingFood) {
        return res.status(400).json({ error: '该食物名称已存在' });
      }

      const food = await Food.create({
        name,
        category,
        unit,
        calories: parseFloat(calories),
        protein: parseFloat(protein),
        fat: parseFloat(fat),
        carbs: parseFloat(carbs),
        fiber: parseFloat(fiber),
        sugar: parseFloat(sugar),
        sodium: parseFloat(sodium),
        image,
        isCustom: true,
        createdBy: userId
      });

      res.status(201).json(food);
    } catch (error) {
      console.error('添加食物失败:', error);
      res.status(500).json({ error: '添加食物失败' });
    }
  },

  // 更新食物信息
  async updateFood(req, res) {
    try {
      const { id } = req.params;
      const userId = req.user.id;
      const updates = req.body;

      const food = await Food.findByPk(id);
      
      if (!food) {
        return res.status(404).json({ error: '食物不存在' });
      }

      // 只允许更新自己创建的自定义食物
      if (food.isCustom && food.createdBy !== userId) {
        return res.status(403).json({ error: '无权修改此食物' });
      }

      // 如果要更新名称，检查新名称是否已存在
      if (updates.name && updates.name !== food.name) {
        const existingFood = await Food.findOne({ where: { name: updates.name } });
        if (existingFood) {
          return res.status(400).json({ error: '该食物名称已存在' });
        }
      }

      await food.update(updates);
      res.json(food);
    } catch (error) {
      console.error('更新食物失败:', error);
      res.status(500).json({ error: '更新食物失败' });
    }
  },

  // 删除食物
  async deleteFood(req, res) {
    try {
      const { id } = req.params;
      const userId = req.user.id;

      const food = await Food.findByPk(id);
      
      if (!food) {
        return res.status(404).json({ error: '食物不存在' });
      }

      // 只允许删除自己创建的自定义食物
      if (food.isCustom && food.createdBy !== userId) {
        return res.status(403).json({ error: '无权删除此食物' });
      }

      await food.destroy();
      res.json({ message: '删除成功' });
    } catch (error) {
      console.error('删除食物失败:', error);
      res.status(500).json({ error: '删除食物失败' });
    }
  },

  // 获取用户自定义食物列表
  async getMyFoods(req, res) {
    try {
      const userId = req.user.id;
      const { page = 1, limit = 10 } = req.query;
      const offset = (page - 1) * limit;

      const { count, rows: foods } = await Food.findAndCountAll({
        where: {
          isCustom: true,
          createdBy: userId
        },
        order: [['createdAt', 'DESC']],
        limit: parseInt(limit),
        offset: parseInt(offset)
      });

      res.json({
        code: 0,
        message: '获取成功',
        data: {
          total: count,
          foods
        }
      });
    } catch (error) {
      console.error('获取自定义食物列表失败:', error);
      res.status(500).json({
        code: 1,
        message: '获取自定义食物列表失败'
      });
    }
  }
};

module.exports = foodController; 